package Compilador2014;

import java.util.LinkedList;

public class Produccion extends Token {

	private char idProduccion;
	private String nombre;
	private LinkedList<String> contenido;
	private Produccion padre;
	private LinkedList<LinkedList<Produccion>> hijos;
	private LinkedList<LinkedList<Token>> terminales;
	
	public Produccion (char idProduccion, boolean seguir) {
		this.idProduccion = idProduccion;
		contenido = new LinkedList<String> ();
		switch (idProduccion) {
		case 'A':
			nombre = "programa";
			contenido.add("a(){BC}b");
			break;
		case 'B':
			nombre = "Blqdecl";
			contenido.add("DB");
			contenido.add("#");
			break;
		case 'C':
			nombre = "Blqinst";
			contenido.add("EC");
			contenido.add("#");
			break;
		case 'D':
			nombre = "Declaracion";
			contenido.add("FnG");
			contenido.add("#");
			break;
		case 'E':
			nombre = "inst";
			contenido.add("H");
			contenido.add("I");
			contenido.add("J");
			contenido.add("K");
			contenido.add("L");
			contenido.add("M");
			break;
		}
		padre = null;
		if (!seguir) {
			hijos = null;
			terminales = null;
		}
		else
			crearHijosTerminales ();
	}
	
	public char getIdProduccion () {
		return idProduccion;
	}
	
	public void crearHijosTerminales () {
		hijos = new LinkedList<LinkedList<Produccion>> ();
		terminales = new LinkedList<LinkedList<Token>> ();
		for (int i=0; i<contenido.size(); i++) {
			LinkedList<Produccion> auxHijos = new LinkedList<Produccion>();
			LinkedList<Token> auxTerminales = new LinkedList<Token>();
			String cadena = contenido.get(i);
			for (int j=0; j<cadena.length(); j++) {
				char c = cadena.charAt(j);
				if (Character.isLowerCase(c))
					auxTerminales.add(new Token (c));
				else {
					if (Character.isUpperCase(c))
						auxHijos.add(new Produccion (c, false));
					else {
						switch (c) {
						case '(': 
						case ')': 
						case '{': 
						case '}':
						case ',':
						case ';':
							auxTerminales.add(new Token (c));
						}
					}
				}
			}
			hijos.add(auxHijos);
			terminales.add(auxTerminales);
		}
	}
}
